package hot

/*
原题链接:
https://leetcode.cn/problems/house-robber/

198. 打家劫舍

你是一个专业的小偷，计划偷窃沿街的房屋。每间房内都藏有一定的现金，
影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统，
如果两间相邻的房屋在同一晚上被小偷闯入，系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组，计算你 不触动警报装置的情况下 ，一夜之内能够偷窃到的最高金额。

示例 1：
输入：[1,2,3,1]
输出：4
解释：偷窃 1 号房屋 (金额 = 1) ，然后偷窃 3 号房屋 (金额 = 3)。

	偷窃到的最高金额 = 1 + 3 = 4 。

示例 2：
输入：[2,7,9,3,1]
输出：12
解释：偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9)，接着偷窃 5 号房屋 (金额 = 1)。

	偷窃到的最高金额 = 2 + 9 + 1 = 12 。

思路:
1 2 3 1   四个房子的金额

用Hi表示, 第i间房屋内藏有的金额数
用Si表示,偷窃前i间房屋能获得的最大金额

第1间房: S0 = H0 = 1

	S0和H0相等,只有一间房可以偷

前2间房: S1 = max(S0, H1) = 2

	因为不能同时偷窃相邻的两间房屋,
	那么偷窃前两间房屋获得的最大金额数, 就是第一间房和第二间房的较大值

前3间房: S2 = max(S1, S0+H2) = 4

	这时有两种方案:
		方案1: 偷窃 1和3两间房
		方案2: 只偷窃 第2间房
	从第3间房的角度出发, 可以理解为偷或者不偷第3间房
	如果偷第3间房, 那么就不能偷相邻的第2间房, 但可以偷第一间房

前4间房: S3 = max(S2, S1+H3) = 4

	可以理解为偷或者不偷第4间房,
		如果偷第4间房,就不能偷相邻的第三间房,
		同时可以偷第一间房或偷第二间房, 具体要看藏有的金额数
		但这里采取的方案,应该和偷取前两个房间获取最大收益的方案是一致的
	那么偷前4间房的情况有两种:
	1.偷第四间房
		最大金额为:
		第四间房金额 + 前2间房的最大金额
	2.不偷第四间房
		最大金额为:
		偷前三间房的最大金额

总结规律:
递推公式: Sn = max(Sn-1, Sn-2 + Hn)
偷窃前 n-1间房屋的最高金额
或偷窃n-2间房屋的最高金额加第n间房屋的金额
*/
func rob123(nums []int) int {
	if len(nums) == 0 {
		return 0
	}
	if len(nums) == 1 {
		return nums[0]
	}
	dp := make([]int, len(nums))
	dp[0] = nums[0]
	dp[1] = max(nums[0], nums[1])
	for i := 2; i < len(nums); i++ {
		dp[i] = max(dp[i-2]+nums[i], dp[i-1])
	}
	return dp[len(nums)-1]
}
